/*
 * RezeptMapper.java
 * 
 *  author: Daniel Rudigier
 *    date: 31.05.2008
 * 
 * 
 */
package ocumed.persistenz.mapper;

import java.util.Calendar;
import java.util.List;

import ocumed.persistenz.dao.BehandlungDAO;
import ocumed.persistenz.dao.BenutzerDAO;
import ocumed.persistenz.dao.DAOFactory;
import ocumed.persistenz.dao.PatientDAO;
import ocumed.persistenz.dao.RezeptDAO;
import ocumed.persistenz.hibernate.OcBehandlung;
import ocumed.persistenz.hibernate.OcBenutzer;
import ocumed.persistenz.hibernate.OcPatient;
import ocumed.persistenz.hibernate.OcRezept;
import ocumed.teams.IRezept;

/**
 * @author Daniel Rudigier
 *
 */
public class RezeptMapper extends PersistenceMapper {

    /**
     * override
     *
     * @see ocumed.persistenz.mapper.PersistenceMapper#delete(java.lang.Object)
     */
    @Override
    public void delete(Object instance) {
        RezeptDAO rDAO = DAOFactory.get(DAOFactory.RDBMS).getRezeptDAO();
        rDAO.start();
        
        IRezept i = (IRezept) instance;
        OcRezept r = rDAO.findById(i.getRezeptid());
        
        rDAO.delete(r);
        rDAO.commit();
    }

    /**
     * override
     *
     * @see ocumed.persistenz.mapper.PersistenceMapper#get(int)
     */
    @Override
    public Object get(int id) {
        RezeptDAO rDAO = DAOFactory.get(DAOFactory.RDBMS).getRezeptDAO();
        rDAO.start();
        return rDAO.findById(id);
    }

    /**
     * override
     *
     * @see ocumed.persistenz.mapper.PersistenceMapper#getAll()
     */
    @Override
    public List getAll() {
        RezeptDAO rDAO = DAOFactory.get(DAOFactory.RDBMS).getRezeptDAO();
        rDAO.start();
        return rDAO.findAll();
    }

    /**
     * override
     *
     * @see ocumed.persistenz.mapper.PersistenceMapper#put(java.lang.Object)
     */
    @Override
    public void put(Object instance) {
        RezeptDAO rDAO = DAOFactory.get(DAOFactory.RDBMS).getRezeptDAO();
        rDAO.start();
        
        IRezept i = (IRezept) instance;
        OcRezept r = rDAO.findById(i.getRezeptid());
        
        if (r != null) {
            updateRezept(r, i);
            rDAO.attachDirty(r);
        } else {
            r = new OcRezept();
            updateRezept(r, i);
            Integer id = rDAO.persist(r);
            r.setRezeptid(id);
        }
        
        rDAO.commit();
    }

    /**
     * @param r
     * @param i
     */
    private void updateRezept(OcRezept r, IRezept i) {
        BehandlungDAO bDAO = DAOFactory.get(DAOFactory.RDBMS).getBehandlungDAO();
        BenutzerDAO uDAO = DAOFactory.get(DAOFactory.RDBMS).getBenutzerDAO();
        PatientDAO pDAO = DAOFactory.get(DAOFactory.RDBMS).getPatientDAO();
        bDAO.start();
        uDAO.start();
        pDAO.start();
        
        OcBehandlung b = i.getiBehandlung() != null ? bDAO.findById(i.getiBehandlung().getBehandlungid()) : null;
        OcBenutzer u = i.getiArzt() != null ? uDAO.findById(i.getiArzt().getBenutzerid()) : null;
        OcPatient p = i.getiPatient() != null ? pDAO.findById(i.getiPatient().getPatientid()) : null;
        
        r.setRezeptid(i.getRezeptid());
        r.setOcBehandlung(b);
        r.setOcBenutzer(u);
        r.setOcPatient(p);
        r.setRezeptbezeichnung(i.getRezeptBezeichnung());
        Calendar c1 = Calendar.getInstance();
        c1.setTime(i.getRezeptdatum());
        r.setRezeptdatum(c1);
        Calendar c2 = Calendar.getInstance();
        c2.setTime(i.getLetzterDruck());
        r.setRezeptletzterdruck(c2);
        r.setRezepttext(i.getRezepttext());
    }

}
